package com.example.springboottest.example.takewhile;

import com.example.springboottest.example.equals.Stu;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

/**
 * Java 9 引入了 takeWhile 方法，如果你用的还是 Java 8，那么非常不幸，你无法使用这
 * 种解决方案。怎样避免这种局限，用 Java 8 提供的功能实现类似的效果呢？
 * <p>
 * 使用takeWhile的时候必须已经排好序了！！！
 * <p>
 * 注意，与 Stream API 提供的版本不同，采用这种方式实现的版本是即时的。理想情况下，
 * 我们更希望采用 Java 9 那种由 Stream 提供的 takeWhile，它具有延迟求值的特性，还能结合
 * noneMatch 来操作。
 */
public class TakeWhileTest {

    public static void main(String[] args) {
        List<Stu> list = new ArrayList<>();

        Stu stu1 = new Stu("tom", 23);
        Stu stu2 = new Stu("jack", 25);
        Stu stu3 = new Stu("rose", 36);
        Stu stu4 = new Stu("haden", 40);

        list.add(stu1);
        list.add(stu2);
        list.add(stu3);
        list.add(stu4);


        List<Stu> takeWhileList = takeWhile(list, (stu -> stu.getAge() < 35));

        takeWhileList.stream().forEach(System.out::println);
    }

    public static <A> List<A> takeWhile(List<A> list, Predicate<A> p) {
        int i = 0;
        for (A item : list) {
            if (!p.test(item)) {
                return list.subList(0, i);
            }
            i++;
        }
        return list;
    }
}
